package br.pesquisa.lsystem;

import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;

public class Gramatica<T> {
	private Alfabeto<T> alfabeto;
	private List<T> axioma;
	private List<Producao<T>> producoes;

	public Gramatica() {
		axioma = new ArrayList<T>();
		producoes = new ArrayList<Producao<T>>();
	}

	public Alfabeto<T> getAlfabeto() {
		return alfabeto;
	}

	public void setAlfabeto(Alfabeto<T> alfabeto) {
		this.alfabeto = alfabeto;
	}

	public List<T> getAxioma() {
		return axioma;
	}

	public List<Producao<T>> getProducoes() {
		return Collections.unmodifiableList(producoes);
	}

	public void adicionarProducao(Producao<T> producao) {
		if(!producoes.contains(producao)) {
			producoes.add(producao);
		}
	}

	public void removerProducao(Producao<T> producao) {
		producoes.remove(producao);
	}

	public List<T> aplicarProducoes(List<T> estado) {
		List<T> novoEstado = new LinkedList<T>();

		if(producoes.size() == 0) {
			novoEstado.addAll(estado);
		} else {
			for(T elemento: estado) {
				boolean semProducao = true;
				for(Producao<T> producao: producoes) {
					if (producao.getPredecessor().equals(elemento)) {
						novoEstado.addAll(producao.getSucessor());
						semProducao = false;
					}
				}
				if(semProducao) {
					novoEstado.add(elemento);
				}
			}
		}
//		for(Producao<T> producao: producoes) {
//			for (int i = 0, j = 0; i < estado.size(); i++, j++) {
//				T elemento = estado.get(i);
//				if (producao.getPredecessor().equals(elemento)) {
//					novoEstado.addAll(j, producao.getSucessor());
//					j += producao.getSucessor().size();
//					novoEstado.remove(j);
//				}
//			}
//		}

		return novoEstado;
	}
}
